package cn.tedu.charging.order.config;

import cn.tedu.charging.common.constant.AmqpComponentConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 在订单服务中,声明延迟队列死信结构的所有组件和绑定关系
 * 其中所有的名字,已经放到Amqp常量类
 */
@Configuration
@Slf4j
public class DelayDeclareConfiguration {
    //声明 fanout类型的业务交换机,生产者就是往这个交换机发送延迟消息
    @Bean
    public Exchange delayExchange(){
        return ExchangeBuilder.fanoutExchange(AmqpComponentConst.DELAY_BILL_EX).build();
    }
    //声明 延迟队列,希望消息在这个队列等待1分钟(消息携带epiration)
    @Bean
    public Queue delayQueue(){
       return QueueBuilder.nonDurable(AmqpComponentConst.DELAY_BILL_QUEUE)
                .deadLetterExchange(AmqpComponentConst.DELAY_BILL_DL_EX)
                .deadLetterRoutingKey(AmqpComponentConst.DELAY_BILL_DL_RK).build();
    }
    //将队列和交换机绑定
    @Bean
    public Binding delayBinding(){
        return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("").noargs();
    }
    //声明死信交换机
    @Bean
    public Exchange delayDlExchange(){
        return ExchangeBuilder.directExchange(AmqpComponentConst.DELAY_BILL_DL_EX).build();
    }
    //声明死信队列
    @Bean
    public Queue delayDlQueue(){
        return QueueBuilder.nonDurable(AmqpComponentConst.DELAY_BILL_DL_QUEUE).build();
    }
    //绑定死信队列到死信交换机 使用死信路由
    @Bean
    public Binding delayDlBinding(){
        return BindingBuilder.bind(delayDlQueue()).to(delayDlExchange()).with(AmqpComponentConst.DELAY_BILL_DL_RK).noargs();
    }
}
